/* 
1. 基础类型 string、number、boolean、 null、undefined、symbol
2. 对象类型 object、array、function、Class
*/
const msg: string = "this is ts~";
console.log(msg);


// 3. 接口 interface 可以继承

interface publicRes {
    a: number;
    b: number;
    c: number | string;
}
// 可以继承公共接口
interface Res2 extends publicRes {
    d: number;
}
const msg2: Res2 = {
    a: 1,
    d: 0,
    b: 0,
    c: "",
};

// 4. Class
class Person {
    /* 
    - public 公共的  允许在类的外面调用 （默认）
    - protected  允许类内和继承的子类中使用
    - private  私有 只允许在类内使用
    */
    private name = "name"
    getName(){
        return this.name
    }
}
const p = new Person()
// console.log(p.name); // 不允许访问私有属性
console.log(p.getName());


class Person1 extends Person {
    constructor(){
        super() // super关键字 调用父类的构造函数
        console.log( 'super.getName' , super.getName()); // 调用父类的getName
        console.log("this.getName" , this.getName()); // 调用自己的getName
    }
    getName(){
        return 'new name'
    }
}

// 5. 泛型
const test1 = <T>(a:T[] , b:T):T[] => {
    a.push(b)
    return a
}

console.log(test1<number>([1,2,3],2));





const p1 = new Person1()
